#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#include <errno.h>
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "daemon.h"
#include "service.h"

#define IN_FILE_PATH  ("config.conf")


void handle_SIGCHLD(int sig);

service_t* head;


int main(int argc, char *argv[]) {
  FILE* f;

  /* crea la lista dei servizi */
  f = fopen(IN_FILE_PATH, "r");
  if (errno != 0) {
    errx(EXIT_FAILURE, "Cannot open config file");
  }
  head = parse_services(f);
  fclose(f);
  if (head == NULL) {
    errx(EXIT_FAILURE, "No services found");
  }

  /* attiva i servizi, rimuovendo dalla lista quelli impossibili da attivare */
  start_services(&head);

  /* registra il gestore del segnale SIGCHILD */
  signal(SIGCHLD, handle_SIGCHLD);

  /* ciclo di processamento delle richieste di servizio */
  for(;;) {
     serve(head);
  }

  /* questo punto di uscita dovrebbe essere irraggiungibile */
  exit(EXIT_FAILURE);
}


void handle_SIGCHLD(int sig) {
  fprintf(stderr, "\n\n\tDIED!\n\n");
  signal(SIGCHLD, handle_SIGCHLD);
  handle_server_term(head);
}
